写监视器

    • 接收 LogEventBroadcaster 广播的 UDP DatagramPacket
    • 解码 LogEvent 消息
    • 输出 LogEvent 消息

    和之前一样,将实现自定义 ChannelHandler 的逻辑。图13.4描述了LogEventMonitor 的 ChannelPipeline 并表明了 LogEvent 的流经情况。

    Figure 13.4 LogEventMonitor

    Listing 13.6 LogEventDecoder

    1. 获取 DatagramPacket 中数据的引用
    2. 获取 SEPARATOR 的索引
    3. 从数据中读取文件名
    4. 构造新的 LogEvent 对象并将其添加到列表中

    第二个 ChannelHandler 将执行一些首先创建的 LogEvent 消息。在这种情况下,我们只会写入 system.out。在真实的应用程序可能用到一个单独的日志文件或放到数据库。

    下面的清单显示了 LogEventHandler。

    1. 继承 SimpleChannelInboundHandler 用于处理 LogEvent 消息
    2. 在异常时,输出消息并关闭 channel
    3. 建立一个 StringBuilder 并构建输出
    4. 打印出 LogEvent 的数据

    LogEventHandler 打印出 LogEvent 的一个易读的格式,包括以下:

    • 收到时间戳以毫秒为单位
    • LogEvent 生成绝对文件名
    • 实际的日志消息,代表在日志文件中一行

    现在我们需要安装处理程序到 ChannelPipeline ,如图13.4所示。下一个清单显示了这是如何实现 LogEventMonitor 类的一部分。

    Listing 13.8 LogEventMonitor

    1. 引导 NioDatagramChannel。设置 SO_BROADCAST socket 选项。
    2. 添加 ChannelHandler 到 ChannelPipeline
    3. 绑定的通道。注意,在使用 DatagramChannel 是没有连接,因为这些
      无连接
    4. 构建一个新的 LogEventMonitor